package davion.study.summercloud.service;

import davion.study.summercloud.mapper.FileStoreMapper;
import davion.study.summercloud.mapper.MyFileMapper;
import davion.study.summercloud.model.FileStore;
import davion.study.summercloud.model.FileStoreExample;
import davion.study.summercloud.model.MyFile;
import davion.study.summercloud.model.MyFileExample;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author: Davion
 * @date: 2020/6/16
 * @description:
 */
@Service
public class MyFileService {
    @Resource
    MyFileMapper myFileMapper;

    @Resource
    FileStoreMapper fileStoreMapper;

    /**
     * 通过用户ID获取根目录下的所有文件
     * @param userId 用户ID
     * @return 文件列表
     */
    public List<MyFile> getRootFilesByUserId(Integer userId) {
        FileStoreExample storeExample = new FileStoreExample();
        storeExample.createCriteria()
                .andUserIdEqualTo(userId);
        List<FileStore> fileStores = fileStoreMapper.selectByExample(storeExample);
        if (fileStores.size() == 0){
            return null;
        }

        MyFileExample fileExample = new MyFileExample();
        fileExample.createCriteria()
                .andStoreIdEqualTo(fileStores.get(0).getId())
                .andFolderIdEqualTo(0);
        List<MyFile> myFiles = myFileMapper.selectByExample(fileExample);
        return myFiles;
    }

    /**
     * 通过用户ID和类型参数获取该用户所有该类型的文件
     * @param userId 用户ID
     * @param type 文件类型
     * @return 文件列表
     */
    public List<MyFile> getFilesByType(Integer userId, int type) {
        FileStoreExample storeExample = new FileStoreExample();
        storeExample.createCriteria()
                .andUserIdEqualTo(userId);
        List<FileStore> fileStores = fileStoreMapper.selectByExample(storeExample);
        if (fileStores.size() == 0) {
            return null;
        }
        MyFileExample fileExample = new MyFileExample();
        fileExample.createCriteria()
                .andStoreIdEqualTo(fileStores.get(0).getId())
                .andTypeEqualTo(type);
        return myFileMapper.selectByExample(fileExample);
    }

    /**
     * 通过文件仓库ID获取仓库根目录下的文件
     * @param storeId 文件仓库ID
     * @return 文件列表
     */
    public List<MyFile> getRootFilesByStoreId(Integer storeId) {
        MyFileExample fileExample = new MyFileExample();
        fileExample.createCriteria()
                .andStoreIdEqualTo(storeId)
                .andFolderIdEqualTo(0);
        return myFileMapper.selectByExample(fileExample);
    }

    /**
     * 通过文件夹ID获取该文件夹下的所有文件
     * @param folderId 文件夹ID
     * @return 文件列表
     */
    public List<MyFile> getFilesByFolderId(Integer folderId) {
        MyFileExample fileExample = new MyFileExample();
        fileExample.createCriteria()
                .andFolderIdEqualTo(folderId);
        return myFileMapper.selectByExample(fileExample);
    }

    /**
     * 根据文件后缀名获得相应的文件类型
     * @param postfix 文件后缀名
     * @return int 1：文本    2：图片    3：视频    4：音乐    5：其他
     */
    public int getType(String postfix) {
        if (".txt".equals(postfix) || ".doc".equals(postfix) || ".docx".equals(postfix)
                || ".wps".equals(postfix) || ".word".equals(postfix) || ".html".equals(postfix)
                || ".pdf".equals(postfix) || ".md".equals(postfix)){
            return 1;
        } else if (".bmp".equals(postfix)  || ".gif".equals(postfix) || ".jpg".equals(postfix)
                || ".pic".equals(postfix) || ".png".equals(postfix) || ".jpeg".equals(postfix)
                || ".svg".equals(postfix) || "webp".equals(postfix)) {
            return 2;
        } else if (".avi".equals(postfix) || ".mov".equals(postfix) || ".qt".equals(postfix)
                || ".asf".equals(postfix) || ".rm".equals(postfix) || ".rmvb".equals(postfix)
                || ".navi".equals(postfix) || ".wav".equals(postfix) || ".mp4".equals(postfix)) {
            return 3;
        } else if (".mp3".equals(postfix) || ".m4a".equals(postfix) || ".flac".equals(postfix)
                || ".ape".equals(postfix)){
            return 4;
        } else {
            return 5;
        }
    }


    public Boolean addNewFile(MyFile newFile) {
        return myFileMapper.insert(newFile) == 1;
    }

    public MyFile getFileById(Integer fId) {
        return myFileMapper.selectByPrimaryKey(fId);
    }

    public Boolean deleteFile(Integer fileId) {
        return myFileMapper.deleteByPrimaryKey(fileId) == 1;
    }

    public Boolean updateFile(MyFile dbFile) {
        return myFileMapper.updateByPrimaryKey(dbFile) == 1;
    }
}
